// DeepSeek API 调用封装模块
import axios from "axios";

// DeepSeek API 端点
const API_ENDPOINT = "https://api.deepseek.com/v1/chat/completions";

// 调用 DeepSeek API 进行翻译
export async function callDeepSeekAPI(content, settings) {
  try {
    const { apiKey, targetLang = "zh", model = "deepseek-chat" } = settings;

    // 根据目标语言设置系统提示
    const systemPrompt = getSystemPromptByLanguage(targetLang);

    // 准备API请求
    const response = await axios.post(
      API_ENDPOINT,
      {
        model: model,
        messages: [
          {
            role: "system",
            content: systemPrompt,
          },
          {
            role: "user",
            content: content,
          },
        ],
        temperature: 0.3,
      },
      {
        headers: {
          "Content-Type": "application/json",
          Authorization: `Bearer ${apiKey}`,
        },
      }
    );

    // 解析并返回翻译结果
    if (
      response.data &&
      response.data.choices &&
      response.data.choices.length > 0
    ) {
      return response.data.choices[0].message.content;
    } else {
      throw new Error("API返回了空的翻译结果");
    }
  } catch (error) {
    console.error("API调用失败:", error);

    // 处理错误响应
    if (error.response) {
      const { status, data } = error.response;

      if (status === 401) {
        throw new Error("API密钥无效或已过期");
      } else if (status === 429) {
        throw new Error("API请求过于频繁，请稍后再试");
      } else {
        throw new Error(
          `API错误(${status}): ${data.error?.message || "未知错误"}`
        );
      }
    } else if (error.request) {
      throw new Error("无法连接到DeepSeek API服务器，请检查网络连接");
    } else {
      throw error;
    }
  }
}

// 处理大型文本分段翻译
export async function translateLargeText(
  content,
  settings,
  maxChunkSize = 4000
) {
  // 如果内容长度小于最大块大小，直接翻译
  if (content.length <= maxChunkSize) {
    return callDeepSeekAPI(content, settings);
  }

  // 将内容分段
  const chunks = splitContentIntoChunks(content, maxChunkSize);
  const translatedChunks = [];

  // 翻译每个分段
  for (const chunk of chunks) {
    const translatedChunk = await callDeepSeekAPI(chunk, settings);
    translatedChunks.push(translatedChunk);
  }

  // 合并翻译结果
  return translatedChunks.join("\n\n");
}

// 将内容分段，尽量在段落边界切分
function splitContentIntoChunks(content, maxChunkSize) {
  const chunks = [];
  let currentChunk = "";

  // 按段落分割内容
  const paragraphs = content.split(/\n\s*\n/);

  for (const paragraph of paragraphs) {
    // 如果段落本身超过最大尺寸，需要进一步分割
    if (paragraph.length > maxChunkSize) {
      // 如果当前块不为空，先添加到chunks
      if (currentChunk.length > 0) {
        chunks.push(currentChunk);
        currentChunk = "";
      }

      // 分割长段落
      let remainingParagraph = paragraph;
      while (remainingParagraph.length > 0) {
        // 尝试在句子边界切分
        const sentenceBreakIndex = findSentenceBreak(
          remainingParagraph,
          maxChunkSize
        );
        chunks.push(remainingParagraph.substring(0, sentenceBreakIndex));
        remainingParagraph = remainingParagraph
          .substring(sentenceBreakIndex)
          .trim();
      }
    }
    // 如果添加当前段落会超过最大尺寸，先添加当前块到chunks
    else if (currentChunk.length + paragraph.length + 2 > maxChunkSize) {
      chunks.push(currentChunk);
      currentChunk = paragraph;
    }
    // 否则将段落添加到当前块
    else {
      currentChunk += (currentChunk.length > 0 ? "\n\n" : "") + paragraph;
    }
  }

  // 添加最后一个块
  if (currentChunk.length > 0) {
    chunks.push(currentChunk);
  }

  return chunks;
}

// 查找句子边界进行切分
function findSentenceBreak(text, maxLength) {
  if (text.length <= maxLength) return text.length;

  // 在最大长度位置向前查找句子结束符
  let index = maxLength;
  while (index > maxLength / 2) {
    if (/[.!?。！？]/.test(text[index - 1])) {
      return index;
    }
    index--;
  }

  // 如果找不到句子边界，退化为寻找空格或逗号
  index = maxLength;
  while (index > maxLength / 1.5) {
    if (/[,，\s]/.test(text[index - 1])) {
      return index;
    }
    index--;
  }

  // 最坏情况，直接在最大长度处切分
  return maxLength;
}

// 根据目标语言获取系统提示词
function getSystemPromptByLanguage(targetLang) {
  const prompts = {
    zh: "请将以下内容翻译成中文，保持原文格式和结构，确保翻译准确、自然、专业。请保留段落结构、标题、列表等原始格式。不要添加任何解释或额外内容。",
    en: "Please translate the following content into English, maintaining the original format and structure. Ensure the translation is accurate, natural, and professional. Preserve paragraph structures, headings, lists, and other original formatting. Do not add any explanations or additional content.",
    ja: "以下の内容を日本語に翻訳してください。原文の形式や構造を維持し、翻訳が正確で自然、専門的であることを確認してください。段落構造、見出し、リストなどの元の書式を保持してください。説明や追加のコンテンツを追加しないでください。",
    ko: "다음 내용을 한국어로 번역해 주세요. 원본 형식과 구조를 유지하고, 번역이 정확하고 자연스러우며 전문적인지 확인하세요. 단락 구조, 제목, 목록 등 원래 형식을 유지하세요. 설명이나 추가 내용을 추가하지 마세요.",
    fr: "Veuillez traduire le contenu suivant en français, en conservant le format et la structure d'origine. Assurez-vous que la traduction est précise, naturelle et professionnelle. Préservez les structures de paragraphes, les titres, les listes et autres formatages d'origine. N'ajoutez pas d'explications ou de contenu supplémentaire.",
  };

  return prompts[targetLang] || prompts["zh"];
}
